home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / games / sakiba / source / open.c < prev    next >
C/C++ Source or Header  |  1999-07-11  |  3KB  |  107 lines

  1. /*
  2.  * PROJECT C Library, X68000 PROGRAMMING INTERFACE DEFINITION
  3.  * --------------------------------------------------------------------
  4.  * This file is written by the Project C Library Group,  and completely
  5.  * in public domain. You can freely use, copy, modify, and redistribute
  6.  * the whole contents, without this notice.
  7.  * --------------------------------------------------------------------
  8.  * $Id: open.c,v 1.1.1.1 1993/04/18 16:17:11 mura Exp $
  9.  */
  10.  
  11. /* System headers */
  12. #include <sys/dos.h>
  13. #include <errno.h>
  14. #include <fcntl.h>
  15. #include <limits.h>
  16. #include <stdarg.h>
  17. #include <stdlib.h>
  18. #include <sys/stat.h>
  19. #include <sys/xglob.h>
  20. #include <sys/xunistd.h>
  21.  
  22. /* External variables */
  23. int _fmode = O_TEXT;
  24. mode_t _umask;
  25.  
  26. /* Functions */
  27. int open (const char *fname, int mode, ...)
  28. {
  29.     int fd, dosmode;
  30.     char buf;
  31.     char abspath[PATH_MAX + 1];
  32.     mode_t create;
  33.     va_list ap;
  34.  
  35.     /* APPEND, TRUNC, CREAT は少なくとも WRITE を必要とする */
  36.     if (mode & (O_TRUNC | O_APPEND | O_CREAT)) {
  37.     if ((mode & (O_WRONLY | O_RDWR)) == 0) {
  38.         mode &= ~(O_RDONLY | O_WRONLY | O_RDWR);
  39.         mode |= O_WRONLY;
  40.     }
  41.     }
  42.  
  43.     /* TEXT, BINARY の指定がない場合に _fmode をデフォルトとする */
  44.     if ((mode & (O_TEXT | O_BINARY)) == 0)
  45.     mode |= _fmode & (O_TEXT | O_BINARY);
  46.  
  47.     /* human に渡すオープンモード */
  48.     dosmode = (mode & O_RDWR) ? 2 : (mode & O_WRONLY) ? 1 : 0;
  49.  
  50.     /* 実際にオープンする */
  51.     if ((fd = _dos_open (fname, dosmode)) < 0) {
  52.  
  53.     /* CREAT じゃなければアウト */
  54.     if ((mode & O_CREAT) == 0) {
  55.         errno = _errcnv (fd);
  56.         return -1;
  57.     }
  58.  
  59.     /* 余分な引数 create を取り出し、アクセスモードマスクをかける */
  60.     va_start (ap, mode);
  61.     create = va_arg (ap, mode_t) & 0777;
  62.     va_end (ap);
  63.  
  64.     /* umask を適用する */
  65.     create &= ~_umask;
  66.     create |= S_IFREG;
  67.  
  68.     /* ファイルを作成する */
  69.     if ((fd = _dos_create (fname, _mode2dos (create))) < 0) {
  70.         errno = _errcnv (fd);
  71.         return -1;
  72.     }
  73.  
  74.     }
  75.  
  76.     /* たとえオープンできても、CREAT & EXCL ならば失敗 */
  77.     else if ((mode & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL)) {
  78.     _dos_close (fd);
  79.     errno = EEXIST;
  80.     return -1;
  81.     }
  82.  
  83.     /* TRUNC ならばファイルを 0 バイトに切り詰める */
  84.     if (mode & O_TRUNC)
  85.     _dos_write (fd, &buf, 0);
  86.  
  87.     /* APPEND ならばファイルの最後に seek する */
  88.     if ((mode & O_APPEND) && _seekeof (fd, mode) < 0)
  89.     return -1;
  90.  
  91. #if 1
  92.     /* フルパスに展開しない */
  93.     strcpy (abspath, fname);
  94. #else
  95.     /* フルパスに展開する */
  96.     if (_fullpath (abspath, fname, PATH_MAX) == 0)
  97.     return -1;
  98. #endif
  99.  
  100.     /* _handles 構造体を作成する */
  101.     if (_open (abspath, fd, mode) < 0)
  102.     return -1;
  103.  
  104.     /* fd を返す */
  105.     return fd;
  106. }
  107.